#include "findbyid.h"
#include <lampe/xml/IXMLFactoryEnvironment.h>
#include <lampe/xml/IXmlNode.h>
#include "irrxml.h"
#include "utils/base_scenenode.h"


namespace lampe{
namespace xml{

/***
 * @class FindByIDFactory
 * Класс отвечающий поиск узлов сцены с заданынм ID
 * */
class FindByIDFactory:public IIrrXmlNode{
private:
	irr::scene::ISceneNode*findByID(irr::scene::ISceneNode*from,s32 id){
		if (from->getID()==id)
			return from;

		irr::scene::ISceneNodeList::ConstIterator it = from->getChildren().begin();
		for (; it != from->getChildren().end(); ++it){
			irr::scene::ISceneNode*res=findByID((*it),id);
			if (res)
				return res;
		}
		return 0;
	}
public:
	FindByIDFactory(irr::IrrlichtDevice*d):IIrrXmlNode(d){}
	virtual LAMPE_VECTOR_VENDOR<String> getProcessedTags(){
		LAMPE_VECTOR_VENDOR<String> list;
		list.push_back("billboard");
		return list;
	};

	virtual lampe::xml::TagResult tagHandlerBefor(lampe::xml::IXMLFactoryEnvironment*environment,lampe::xml::IXmlNode*node){
		irr::scene::ISceneNode*parent=0;

		if ((node->getParent()) && (node->getParent()->getTag())){
			parent=(irr::scene::ISceneNode*)node->getParent()->getTag();
		}
		if (!parent)
			return lampe::xml::STOP;

		s32 id=node->getAttS32("id",0);

		irr::scene::ISceneNode*bb=findByID(parent,id);
		if (!bb)
			return lampe::xml::STOP;
		readBaseSceneNodeTags(bb,node);
		node->setTag(bb);
		return lampe::xml::NEXT;
	}
};

}//namespace xml
}//namespace lampe

void regFindByID(lampe::xml::IXMLFactoryEnvironment*environment,irr::IrrlichtDevice*d){
	lampe::xml::IFactoryRecord*h=new lampe::xml::FindByIDFactory(d);
	environment->registerHandler(h);
	h->drop();
}